#include <iostream>
#include <vector>
using namespace std;
const int N=110;
struct node {
	int v,w,p;
};
int f[N][N];
int v[N],w[N];
int n,m;
vector<int> edge[N];

void dfs(int rt)
{
	for(int i=v[rt];i<=m;i++)
	{
		f[rt][i]=w[rt];
	}
	
	for(auto& son:edge[rt])
	{
		dfs(son);
		for(int i=m;i>=v[rt];i--)
		{
			for(int j=0;j<=i-v[rt];j++)
			{
				f[rt][i]=max(f[rt][i],f[rt][i-j]+f[son][j]);
			}
		}
		
	}
	
	
	
}
int main()
{
	cin>>n>>m;
	int root=-1;
	for(int i=1;i<=n;i++)
	{
		int c;
		cin>>v[i]>>w[i]>>c;
		if(c==-1)
			root=i;
		else{
			edge[c].push_back(i);
		}
	}
	dfs(root);
	cout<<f[root][m]<<endl;
	return 0;
}
